package types

import "encoding/json"

type DelChatTask = int

const (
	DelayDelDialogByAssistant DelChatTask = iota
	DelayDelMsgByAssistant
	DelayDelMsgByDialog
)

type DelTask struct {
	DelType DelChatTask `json:"deltype"`
	Data    []byte      `json:"data"`
}

type DelAssistantInfo struct {
	AssistantId string `json:"assistantId"`
	UserId      int64  `json:"userId"`
}

type DelDialogsInfo struct {
	DialogIds []string `json:"dialogIds"`
	UserId    int64    `json:"userId"`
}

type DelOneDialogInfo struct {
	DialogId string `json:"dialogId"`
	UserId   int64  `json:"userId"`
}

func DelAssistantPayload(assistantId string, userId int64) ([]byte, error) {
	data, err := MarshalDelAssistantInfo(assistantId, userId)
	if err != nil {
		return nil, err
	}
	payload, err := MarshalDelTask(DelayDelDialogByAssistant, data)
	if err != nil {
		return nil, err
	}
	return payload, nil
}

func DelDialogsPayload(dialogIds []string, userId int64) ([]byte, error) {
	data, err := MarshalDelDialogsInfo(dialogIds, userId)
	if err != nil {
		return nil, err
	}
	payload, err := MarshalDelTask(DelayDelMsgByAssistant, data)
	if err != nil {
		return nil, err
	}
	return payload, nil
}

func DelOneDialogPayload(dialogId string, userId int64) ([]byte, error) {
	data, err := MarshalDelOneDialogInfo(dialogId, userId)
	if err != nil {
		return nil, err
	}
	payload, err := MarshalDelTask(DelayDelMsgByDialog, data)
	if err != nil {
		return nil, err
	}
	return payload, nil
}

func MarshalDelTask(deltype DelChatTask, data []byte) ([]byte, error) {
	delTask := DelTask{
		DelType: deltype,
		Data:    data,
	}
	return json.Marshal(delTask)
}

func UnmarshalDelTask(payload []byte) (*DelTask, error) {
	var delTask DelTask
	err := json.Unmarshal(payload, &delTask)
	if err != nil {
		return nil, err
	}
	return &delTask, nil
}

func MarshalDelAssistantInfo(assistantId string, userId int64) ([]byte, error) {
	info := DelAssistantInfo{
		AssistantId: assistantId,
		UserId:      userId,
	}
	return json.Marshal(info)
}

func UnmarshalDelAssistantInfo(payload []byte) (*DelAssistantInfo, error) {
	var info DelAssistantInfo
	err := json.Unmarshal(payload, &info)
	if err != nil {
		return nil, err
	}
	return &info, nil
}

func MarshalDelDialogsInfo(dialogIds []string, userId int64) ([]byte, error) {
	info := DelDialogsInfo{
		DialogIds: dialogIds,
		UserId:    userId,
	}
	return json.Marshal(info)
}

func UnmarshalDelDialogsInfo(payload []byte) (*DelDialogsInfo, error) {
	var info DelDialogsInfo
	err := json.Unmarshal(payload, &info)
	if err != nil {
		return nil, err
	}
	return &info, nil
}

func MarshalDelOneDialogInfo(dialogId string, userId int64) ([]byte, error) {
	info := DelOneDialogInfo{
		DialogId: dialogId,
		UserId:   userId,
	}
	return json.Marshal(info)
}

func UnmarshalDelOneDialogInfo(payload []byte) (*DelOneDialogInfo, error) {
	var info DelOneDialogInfo
	err := json.Unmarshal(payload, &info)
	if err != nil {
		return nil, err
	}
	return &info, nil
}
